import XLSX from 'xlsx-js-style';
import { shallowRef, unref } from "vue";
// 档案表格导出方法
export function _export_dangan(data, baseinfo, fileName) {
    // 转换为二维数组
    const rowData = data.map(x => ([x.name, x.create_time, x.names, x.f_avg_fraction, x.final_score]));

    // 创建工作簿
    const wb = XLSX.utils.book_new();

    // 创建工作表，只保留标题行和数据
    const ws = XLSX.utils.aoa_to_sheet([
        [{ v: `${baseinfo}`, t: 's' }], // 第一行：填入baseinfo的标题
        ['课程名', '上课时间', '任课老师', '作业评分', '考试成绩'], // 第二行：列标题
        ...rowData // 数据行
    ]);

    // 设置列宽
    const colWidth = [
        { wch: 15 }, { wch: 20 }, { wch: 20 }, { wch: 10 }, { wch: 10 }
    ];
    ws['!cols'] = colWidth;

    // 合并第一行的单元格
    ws['!merges'] = [
        { s: { r: 0, c: 0 }, e: { r: 0, c: 4 } }, // 第一行
    ];

    // 设置第一行样式
    ws['A1'].s = {
        font: { sz: 12 },
        alignment: { horizontal: 'left', vertical: 'center', wrapText: true },
        // fill: {fgColor: {rgb: "FFFF00"}} // 黄色背景
    };

    // 设置行高
    ws['!rows'] = [
        { hpt: 120 }, // 第一行高度
        { hpt: 25 }  // 第二行高度
    ];

    // 为数据行设置高度
    const dataRowHeight = 22; // 设定数据行的高度
    for (let i = 2; i < rowData.length + 2; i++) { // 注意这里从2开始，因为前面已有两行
        ws['!rows'].push({ hpt: dataRowHeight });
    }

    // 设置列标题行样式
    ['A2', 'B2', 'C2', 'D2', 'E2'].forEach(cell => {
        ws[cell].s = {
            font: { sz: 12, bold: true },
            alignment: { horizontal: 'center', vertical: 'center' },
            fill: { fgColor: { rgb: "CCCCCC" } } // 灰色背景
        };
    });

    // 设置数据单元格样式
    for (let i = 3; i <= rowData.length + 2; i++) {
        ['A', 'B', 'C', 'D', 'E'].forEach(col => {
            if (ws[col + i]) {
                ws[col + i].s = {
                    font: { sz: 11 },
                    alignment: { horizontal: 'center', vertical: 'center' },
                    border: {
                        top: { style: 'thin' },
                        bottom: { style: 'thin' },
                        left: { style: 'thin' },
                        right: { style: 'thin' }
                    }
                };
            }
        });
    }

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(wb, ws, "Sheet1");

    // 生成Excel文件并下载
    XLSX.writeFile(wb, fileName || 'export.xlsx');
}


//学生提交作业列表导出方法
export function _export_works(data, fileName) {

    // 转换为二维数组
    const rowData = data.map(x => ([x.nick_name, x.status, x.create_time, x.fraction]));

    // 创建工作簿
    const wb = XLSX.utils.book_new();

    // 创建工作表，只保留标题行和数据
    const ws = XLSX.utils.aoa_to_sheet([

        ['学生姓名', '状态', '提交时间', '分数'], // 第二行：列标题
        ...rowData // 数据行
    ]);

    // 设置列宽
    const colWidth = [
        { wch: 15 }, { wch: 20 }, { wch: 20 }, { wch: 10 }
    ];
    ws['!cols'] = colWidth;


    // 设置行高
    ws['!rows'] = [
        { hpt: 25 }  // 第二行高度
    ];
    // 数据行的高度
    const normalRowHeight = { hpt: 22 };
    // 为数据行设置高度
    for (let i = 0; i < rowData.length; i++) {
        ws['!rows'].push(normalRowHeight);
    }


    // 设置列标题行样式
    ['A1', 'B1', 'C1', 'D1'].forEach(cell => {
        ws[cell].s = {
            font: { sz: 12, bold: true },
            alignment: { horizontal: 'center', vertical: 'center' },
            fill: { fgColor: { rgb: "CCCCCC" } } // 灰色背景
        };
    });

    // 设置数据单元格样式
    for (let i = 2; i <= rowData.length + 2; i++) {

        ['A', 'B', 'C', 'D'].forEach(col => {



            if (ws[col + i]) {
                ws[col + i].s = {
                    font: { sz: 11 },
                    alignment: { horizontal: 'center', vertical: 'center' },
                    border: {
                        top: { style: 'thin' },
                        bottom: { style: 'thin' },
                        left: { style: 'thin' },
                        right: { style: 'thin' }
                    }
                };
            }
        });
    }

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(wb, ws, "Sheet1");

    // 生成Excel文件并下载
    XLSX.writeFile(wb, fileName || 'export.xlsx');
}

//老师布置 作业列表导出
export function _export_tworks(data, fileName) {
    // 转换为二维数组
    const rowData = data.map(x => ([x.name, x.status_name, x.nick_name, x.release_time, x.end_time, x.count]));

    // 创建工作簿
    const wb = XLSX.utils.book_new();

    // 创建工作表，只保留标题行和数据
    const ws = XLSX.utils.aoa_to_sheet([

        ['作业名称', '状态', '创建者', '开始时间', '结束时间', '班级人数'], // 第二行：列标题
        ...rowData // 数据行
    ]);

    // 设置列宽
    const colWidth = [
        { wch: 15 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }, { wch: 20 }
    ];
    ws['!cols'] = colWidth;


    // 设置行高
    ws['!rows'] = [
        { hpt: 25 }  // 第二行高度
    ];


    // 数据行的高度
    const normalRowHeight = { hpt: 22 };
    // 为数据行设置高度
    for (let i = 0; i < rowData.length; i++) {
        ws['!rows'].push(normalRowHeight);
    }

    // 设置列标题行样式
    ['A1', 'B1', 'C1', 'D1', 'E1', 'F1'].forEach(cell => {
        ws[cell].s = {
            font: { sz: 12, bold: true },
            alignment: { horizontal: 'center', vertical: 'center' },
            fill: { fgColor: { rgb: "CCCCCC" } } // 灰色背景
        };
    });

    // 设置数据单元格样式
    for (let i = 2; i <= rowData.length + 2; i++) {
        ['A', 'B', 'C', 'D', 'E', 'F'].forEach(col => {
            if (ws[col + i]) {
                ws[col + i].s = {
                    font: { sz: 11 },
                    alignment: { horizontal: 'center', vertical: 'center' },
                    border: {
                        top: { style: 'thin' },
                        bottom: { style: 'thin' },
                        left: { style: 'thin' },
                        right: { style: 'thin' }
                    }
                };
            }
        });
    }

    // 将工作表添加到工作簿
    XLSX.utils.book_append_sheet(wb, ws, "Sheet1");

    // 生成Excel文件并下载
    XLSX.writeFile(wb, fileName || 'export.xlsx');
}


// 用户导入选择文件方法

export const useFileSelector = (opts = {}) => {
    const { accept = '.xls, .xlsx', success } = opts
    const fileRef = shallowRef(null)
    const inputEle = document.createElement('input')
    inputEle.type = 'file'
    inputEle.accept = accept

    const changeListener = e => {
        const files = e.target.files
        inputEle.removeEventListener('change', changeListener)
        if (files.length === 1) {
            fileRef.value = files[0]
            success && success(fileRef.value)
        }
    }
    inputEle.addEventListener('change', changeListener)
    inputEle.click()

    return {
        fileRef
    }
}








